package br.ucb.sigplan.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import br.ucb.sigplan.beans.Atividade;
import br.ucb.sigplan.beans.Conteudo;
import br.ucb.sigplan.beans.Cronograma;
import br.ucb.sigplan.connection.FactoryCon;
import br.ucb.sigplan.dao.CronogramaDAO;
import br.ucb.sigplan.exception.DAOException;

public class CronogramaDAOImpl implements CronogramaDAO{
	private final String SQL_INSERT = "insert into cronograma (idconteudo, idatividade, idplanoEnsino) values (?,?,?)";
	private final String SQL_SEARCHBYIDPLANO = "select * from atividade a, conteudo c, cronograma r where r.idatividade = a.idatividade and r.idconteudo = c.idconteudo and r.idplanoEnsino = ?";
	private final String SQL_DELETE = "delete from cronograma where idconteudo = ? and idatividade = ? and idplanoensino = ?";
	
	public Cronograma searchByPlano(Integer idplano) throws DAOException {
		Cronograma cronograma = new Cronograma();
		Connection con = FactoryCon.getInstance().createConnection();
		PreparedStatement instrucao = null;
		ResultSet set = null;
		try {
			instrucao = con.prepareStatement(SQL_SEARCHBYIDPLANO);
			instrucao.setInt(1, idplano);
			set = instrucao.executeQuery();
			while (set.next()) {
				putCronograma(set, cronograma);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException("erroPesquisa");
		} finally {
			FactoryCon.closeConnection(con, instrucao, set);
		}
		return cronograma;
	}
	
	public void insert(Atividade atividade, Conteudo conteudo, Integer idplano) throws DAOException {
		Connection con = FactoryCon.getInstance().createConnection();
		PreparedStatement instrucao = null;
		try {
			instrucao = con.prepareStatement(SQL_INSERT);
			instrucao.setInt(1, conteudo.getIdConteudo());
			instrucao.setInt(2, atividade.getIdAtividade());
			instrucao.setInt(3, idplano);
			instrucao.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException("erroInsercao");
		} finally {
			FactoryCon.closeConnection(con, instrucao);	
		}
	}
	
	private void putCronograma(ResultSet set, Cronograma cronograma) throws SQLException {
		cronograma.addCronograma(getAtividade(set), getConteudo(set));
	}
	
	private Atividade getAtividade(ResultSet set) throws SQLException {
		Atividade atividade = new Atividade();
		atividade = new AtividadeDAOImpl().searchById(set.getInt("idatividade"));
		return atividade;
	}
	
	private Conteudo getConteudo(ResultSet set) throws SQLException {
		Conteudo conteudo = new Conteudo();
		conteudo = new ConteudoDAOImpl().findById(set.getInt("idconteudo"));
		return conteudo;
	}

	@Override
	public void delete(Atividade atividade, Conteudo conteudo, Integer idplano)
			throws DAOException {
		Connection con = FactoryCon.getInstance().createConnection();
		PreparedStatement instrucao = null;
		try {
			instrucao = con.prepareStatement(SQL_DELETE);
			instrucao.setInt(1, conteudo.getIdConteudo());
			instrucao.setInt(2, atividade.getIdAtividade());
			instrucao.setInt(3, idplano);
			instrucao.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException("erroDelecao");
		} finally {
			FactoryCon.closeConnection(con, instrucao);	
		}
	}
	
}
